Este guía es para ayudar a un desarrollador OpenXava 2 a empezar rápidamente con OpenXava 3.
OX3 será completamente compatible con OX2 y podremos ejecutar nuestras aplicaciones OX2 usando OX3, además podemos continuar desarrollando con XML en OX3.
Definición de componentes
La principal diferencia entre OX2 y OX3 es el formato para definir componentes.
En OX2 usamos XML, como sigue:
Ahora podemos escribir la lógica directamente en nuestras clases Java, por tanto no es necesario usar calculadores para propiedades calculadas o métodos.
El mapeo objeto-relacional se hace mediante las anotaciones JPA. Y el resto (tab y vista) es una traducción literal del XML de OpenXava a anotaciones Java.
Agregados
Los agregados ya no existen en OX3. Pero podemos simular los agregados usando objetos embebidos para las referencias simples, y colecciones de entidades con borrar en cascada para las colecciones.
Es decir, en OX escribiamos:
Como podemos ver, usamos objetos embebidos JPA que funcionan exactamente igual que los agregados de OpenXava para el caso de una referencia simple.
Para colecciones de agregados con OX2 escribimos:
private Distancia distancia;publicenum Distancia { LOCAL, NACIONAL, INTERNACIONAL };
Tiene el mismo efecto, con la diferencia de que:
El tipo de dato no es int, sino Distancia.
Al grabar en la base de datos los valores posibles graban por defecto 0 para vacío, 1 para local, 2 para naciona y 3 para internacional, mientras que el enum graba nulo para vacío, 0 para LOCAL, 1 para NACIONAL y 2 para INTERNACIONAL.
Es decir, si queremos usar una database de OX2 con OX3 necesitamos usar un Hibernate Type, como sigue:
Base1EnumType es un Hibernate Type incluido en OpenXava para grabar un enum de Java 5 usando índice de base 1. De esta manera podemos ir contra la base de datos de nuestra aplicación OX3 usando OX2.
Calculadores valor defecto al crear
El calculador-valor-defecto de OX2 esta disponible en OX3 mediante la anotación @DefaultValueCalculator. Pero @DefaultValueCalculator no soporta al-crear="true" de su homólogo en XML. Hemos de simular el efecto de este tipo de calculador usando su equivalente en JPA.
Para un id autogenerado podemos usar la anotacion JPA @GeneratedValue. Por ejemplo, en OX2 escribimos:
Es decir, código JPA puro y duro.
Pero <calculador-valor-defecto ... al-crear="true"/> es más flexible que @GeneratedValue porque admite cualquier lógica, y puede ser usada por propiedades no clave. En este caso podemos usar un método @PrePersist de JPA. Veamos un ejemplo. Cuando en OX2 escribimos:
Donde InvoiceDetailOidCalculator tiene una lógica personalizada para generar el valor. Esto puede ser fácilmente traducido a OX3 añadiendo el siguiente método a nuestro POJO:
En este caso la lógica del método calcularOID is la misma que la de InvoiceDetailOIDCalculator. Y una vez más usamos código JPA puro y duro.
Calculadores de retrollamada: poscrear, postmodificar, poscargar, preborrar and posborrar
En lugar de <calculador-poscrear/>, <calculador-posmodificar/>, <postload-calculator/>, <preremove-calculator/> y <postremove-calculator/> en OX3 usamos los métodos de retrollamada de JPA, es decir, métodos en nuestras entidades anotados con @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate y @PostLoad.
Por ejemplo, si tenemos una colección como esta en un componente Factura:
Los utilísimos conversores de OpenXava no están disponibles en OX3.Pero no nos debemos preocupar demasiado, porque podemos usar Type de Hibernate, que proporciona casi toda la funcionalidad de los conversores de OpenXava.
Mira la Referencia de Hibernate sobre Type,
Type de Hibernate tiene algunos inconvenientes sobre los clásicos conversores de OpenXava:
Los conversores por defecto (del archivo defaults-converter.xml y conversores.xml) no están soportados.
Conversores para referencias no se soportan.
persistence.xml en vez de configuration
En el build.xml la propiedad 'configuration' ya no se usa. Ahora en vez de los archivos de propiedades podemos comentar y descomentar código en persistence.xml para poder trabajar con varias configuraciones, de esta manera:
Como se ve, hemos de usar el método toKeyString() (incluido en ModuleTestBase), y no el método toString() del POJO.
Esta técnica también funciona con OX2.
Propiedad de vista
Las propiedades de vista no existen en OX3. Pero es fácil simularlos usando propiedades transitorias en nuestro modelo.
Es decir, en OX2 escribimos:
Table of Contents
Guía para la migración mental de OX2 a OX3
Este guía es para ayudar a un desarrollador OpenXava 2 a empezar rápidamente con OpenXava 3.OX3 será completamente compatible con OX2 y podremos ejecutar nuestras aplicaciones OX2 usando OX3, además podemos continuar desarrollando con XML en OX3.
Definición de componentes
La principal diferencia entre OX2 y OX3 es el formato para definir componentes.En OX2 usamos XML, como sigue:
En OX3 usamos Java con anotaciones:
Ahora podemos escribir la lógica directamente en nuestras clases Java, por tanto no es necesario usar calculadores para propiedades calculadas o métodos.
El mapeo objeto-relacional se hace mediante las anotaciones JPA. Y el resto (tab y vista) es una traducción literal del XML de OpenXava a anotaciones Java.
Agregados
Los agregados ya no existen en OX3. Pero podemos simular los agregados usando objetos embebidos para las referencias simples, y colecciones de entidades con borrar en cascada para las colecciones.Es decir, en OX escribiamos:
Y en OX3 escribimos:
Como podemos ver, usamos objetos embebidos JPA que funcionan exactamente igual que los agregados de OpenXava para el caso de una referencia simple.
Para colecciones de agregados con OX2 escribimos:
Pero en OX3 escribimos:
Es decir, usamos una coleccion de entidades con borrar en cascada, y esto se comporta como una colección de agregados de OX2.
Valores posibles
Los <valores-posibles/> de OX2 se implementan en OX3 usando enums de Java 5.Es decir, en OX2 escribimos:
Su equivalente en OX3 es:
Tiene el mismo efecto, con la diferencia de que:
- El tipo de dato no es int, sino Distancia.
- Al grabar en la base de datos los valores posibles graban por defecto 0 para vacío, 1 para local, 2 para naciona y 3 para internacional, mientras que el enum graba nulo para vacío, 0 para LOCAL, 1 para NACIONAL y 2 para INTERNACIONAL.
Es decir, si queremos usar una database de OX2 con OX3 necesitamos usar un Hibernate Type, como sigue:Base1EnumType es un Hibernate Type incluido en OpenXava para grabar un enum de Java 5 usando índice de base 1. De esta manera podemos ir contra la base de datos de nuestra aplicación OX3 usando OX2.
Calculadores valor defecto al crear
El calculador-valor-defecto de OX2 esta disponible en OX3 mediante la anotación @DefaultValueCalculator. Pero @DefaultValueCalculator no soporta al-crear="true" de su homólogo en XML. Hemos de simular el efecto de este tipo de calculador usando su equivalente en JPA.Para un id autogenerado podemos usar la anotacion JPA @GeneratedValue. Por ejemplo, en OX2 escribimos:
En OX3 escribimos:
Es decir, código JPA puro y duro.
Pero <calculador-valor-defecto ... al-crear="true"/> es más flexible que @GeneratedValue porque admite cualquier lógica, y puede ser usada por propiedades no clave. En este caso podemos usar un método @PrePersist de JPA. Veamos un ejemplo. Cuando en OX2 escribimos:
Donde InvoiceDetailOidCalculator tiene una lógica personalizada para generar el valor. Esto puede ser fácilmente traducido a OX3 añadiendo el siguiente método a nuestro POJO:
En este caso la lógica del método calcularOID is la misma que la de InvoiceDetailOIDCalculator. Y una vez más usamos código JPA puro y duro.
Calculadores de retrollamada: poscrear, postmodificar, poscargar, preborrar and posborrar
En lugar de <calculador-poscrear/>, <calculador-posmodificar/>, <postload-calculator/>, <preremove-calculator/> y <postremove-calculator/> en OX3 usamos los métodos de retrollamada de JPA, es decir, métodos en nuestras entidades anotados con @PrePersist, @PostPersist, @PreRemove, @PostRemove, @PreUpdate, @PostUpdate y @PostLoad.Por ejemplo, si tenemos una colección como esta en un componente Factura:
Con esta clase calculador:
En OX3 solo necesitamos tener un método como este en la clase LineaFactura:
En este caso, más fácil que en OX2.
Conversores
Los utilísimos conversores de OpenXava no están disponibles en OX3.Pero no nos debemos preocupar demasiado, porque podemos usar Type de Hibernate, que proporciona casi toda la funcionalidad de los conversores de OpenXava.Mira la Referencia de Hibernate sobre Type,
Type de Hibernate tiene algunos inconvenientes sobre los clásicos conversores de OpenXava:
persistence.xml en vez de configuration
En el build.xml la propiedad 'configuration' ya no se usa. Ahora en vez de los archivos de propiedades podemos comentar y descomentar código en persistence.xml para poder trabajar con varias configuraciones, de esta manera:Aquí tenemos 3 configuraciones y podemos activar una de ellas fácilmente con solo comentar o descomentar.
Pruebas JUnit: Poniendo valor a un combo para una referencia con clave compuesta
En OX3 ésta es la forma de poner valor a un combo con clave compuesta:Como se ve, hemos de usar el método toKeyString() (incluido en ModuleTestBase), y no el método toString() del POJO.
Esta técnica también funciona con OX2.
Propiedad de vista
Las propiedades de vista no existen en OX3. Pero es fácil simularlos usando propiedades transitorias en nuestro modelo.Es decir, en OX2 escribimos:
Y ahora con OX3 escribimos:
Con el mismo efecto.